listbase: Don't start rubberband on ::drag-end
authorAntónio Fernandes <antoniojpfernandes@gmail.com>
Sat, 4 Jun 2022 17:30:10 +0000 (17:30 +0000)
committerAntónio Fernandes <antoniojpfernandes@gmail.com>
Sat, 4 Jun 2022 17:30:10 +0000 (17:30 +0000)
GtkGestrureDrag::drag-end can be emitted when the pointer has just
crossed the drag threshold and we have not started the rubberband yet.
This happens if another gesture has claimed the event sequence earlier
in the current event propagation chain.

In such situation, our ::drag-end calls gtk_list_base_drag_update(),
which proceeds to start the rubberband. That's obviously wrong.
Additionally, it also tries to get modifiers from an event it we are
already denied,  which obviously fails with criticals:

`gdk_event_get_modifier_state: assertion 'GDK_IS_EVENT (event)' failed`

Thus, if there is no rubberband when we receive ::drag-end, do nothing.

gtk/gtklistbase.c

index bf0657a04f742f8c9ec920e81d73a79d688af94c..7d1d44963caa83e2158a62da43e829dd42594b3f 100644 (file)
@@ -1721,8 +1721,12 @@ gtk_list_base_drag_end (GtkGestureDrag *gesture,
                         double          offset_y,
                         GtkListBase    *self)
 {
+  GtkListBasePrivate *priv = gtk_list_base_get_instance_private (self);
   gboolean modify, extend;
 
+  if (!priv->rubberband)
+    return;
+
   gtk_list_base_drag_update (gesture, offset_x, offset_y, self);
   get_selection_modifiers (GTK_GESTURE (gesture), &modify, &extend);
   gtk_list_base_stop_rubberband (self, modify, extend);